package com.kgc.bigdata.spark.scala

/**
  * Scala高阶函数的使用
  */
object ScalaOperate {

  def main(args: Array[String]) {
    val l = List(1, 2, 3, 4, 5, 6, 7, 8)

    //map：对传入的每个元素都进行映射，返回一个处理后的元素
    //foreach：对传入的每个元素都进行处理，但是没有返回值，比如这里对里面的每个元素都做打印操作
    l.map(_ * 2).foreach(println)

    //filter：对传入的每个元素都进行条件判断，如果对元素判断后为true，则保留该元素，否则过滤掉该元素
    l.map(_ * 2).filter(_ > 8).foreach(println)
    println("------------------")

    //取前4个
    l.take(4).foreach(println)
    println("------------------")

    //reduce函数：即先对元素1和元素2进行处理，然后将结果与元素3处理，再将结果与元素4处理，依次类推
    println(l.reduce(_ + _)) //36
    println(l.reduce(_ - _)) //-34

    //取集合中的最大值、最小值、和、记录数、平均数等
    println(l.max)
    println(l.count(_ > 3))
    println(l.min)
    println(l.sum)
    println("------------------")

    //zip：对应位置的元素组合成一个元素
    val a = List(1, 2, 3, 4)
    val b = List("A", "B", "C", "D")
    println(a zip b) //List((1,A), (2,B), (3,C), (4,D))

    val c = List("A", "B", "C", "D", "E")
    println(a zip c) //List((1,A), (2,B), (3,C), (4,D))

    val d = List(1, 2, 3, 4, 5)
    //测试发现:只有当两者的个数相同时才能匹配上
    println(d zip c) //List((1,A), (2,B), (3,C), (4,D), (5,E))

    //将学生姓名和成绩关联
    List("zhangsan", "lisi", "wangwu").zip(List(100, 90, 75, 83))

    //flatten：将所有元素都压到一起
    val f = List(List(1, 2), List(3, 4), List(5, 6)) //list中嵌套list
    println(f.flatten) //List(1, 2, 3, 4, 5, 6)

    //flatMap=map+flatten
    println(f.flatMap(_.map(_ * 2))) //List(2, 4, 6, 8, 10, 12)

    //注意map和flatMap的区别：map是对每个元素进行某个操作，flatMap是先压到一个元素中去再做map操作
    println(f.map(_.map(_ * 2))) //List(List(2, 4), List(6, 8), List(10, 12))

  }

}
